Debug.flagSet('feredata');

$(document).ready(function() {
	window.name = 'kafenio';
	Kafenio.diafimisiSetup();
	Kafenio.motdSetup();
	Kafenio.ofelimoSetup();
	Kafenio.kpanel.setup();
	Kafenio.cpanel.setup();
	Kafenio.epanel.setup();
	Kafenio.tabTsoxa();
	Client.toolbarLeft('pexnidi');
	Client.toolbarRight();
	Client.bodyFloat(Kafenio.ofelimoStretch);
	Kafenio.salute();
	$(window).trigger('resize');
});

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Kafenio = {
	flags: {
		diafimisi: false,
		motd: false,
		emoticon: true,
	},
	profinfoDOM: {},
	profinfoOffset: {},
};

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Kafenio.unload = function() {
	if (Kafenio.unloaded) return;
	Kafenio.unloaded = true;
	Kafenio.tsoxa.close();
};

$(window).on('beforeunload', function() {
	Kafenio.unload();
});

$(window).on('unload', function() {
	Kafenio.unload();
});

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

// Η μέθοδος "salute" καλείται αμέσως μετά τη διαμόρφωση κενού σκηνικού πλαισίου
// και σκοπό έχει την πλήρωση του σκηνικού με τα τρέχοντα σκηνικά δεδομένα.

Kafenio.salute = function() {
	Client.fyi.pano('Αναμένονται πλήρη σκηνικά δεδομένα. Παρακαλώ περιμένετε…').
	skiserService('salute').
	done(function(rsp) {
		Kafenio.skiniko = new Skiniko().stisimo(function() {
			Client.fyi.pano('Καλώς ήλθατε στον «Πρεφαδόρο»');
			Client.fyi.kato('Καλή διασκέδαση και καλές σολαρίες!');
		});
	}).
	fail(function(rsp) {
		$.ajax('account/exodos.php', {async: false});
		Client.error('Η συνεδρία σας έχει λήξει!');
	});
};

Kafenio.ofelimoSetup = function() {
	Kafenio.ofelimoDOM = $('#ofelimo').
	append(Kafenio.thamonesDOM = $('<div>').attr('id', 'thamones').addClass('stili')).
	append(Kafenio.kpanelDOM = $('<div>').addClass('stili panel')).
	append(Kafenio.trapeziaDOM = $('<div>').attr('id', 'trapezia').addClass('stili')).
	append(Kafenio.cpanelDOM = $('<div>').addClass('stili panel')).
	append(Kafenio.pssDOM = $('<div>').attr('id', 'pss').addClass('stili')).
	append(Kafenio.epanelDOM = $('<div>').attr('id', 'epanel').addClass('stili panel'));
	Kafenio.pss.setup();
	Kafenio.mainDOM = Kafenio.trapeziaDOM;
};

Kafenio.diafimisiSetup = function() {
	$('#diafimisi').css('display' , Kafenio.flags.diafimisi ? 'block' : 'none');
	Client.diafimisi.callback = function() {
		Kafenio.flags.diafimisi = false;
		Kafenio.panelRefresh();
	}
};

Kafenio.motdSetup = function() {
	$('#motd').css('display' , Kafenio.flags.motd ? 'block' : 'none');
	Client.motd.callback = function() {
		Kafenio.flags.motd = false;
		Kafenio.panelRefresh();
	}
};

Kafenio.panelRefresh = function() {
	Kafenio.kpanel.refresh();
	Kafenio.cpanel.refresh();
	Kafenio.tabTsoxa(Kafenio.egoIsTrapezi());
};

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Kafenio.ofelimoStretch = function() {
	var diastasi, pssW, sizitisiH;

	Kafenio.ofelimoVerticalStretch();
	Kafenio.ofelimoHorizontalStretch();

	// Έχει γίνει διαμόρφωση των περιοχών και εφόσον δεν υπάρχει
	// κρατημένη διάσταση στο session cookie, την κρατάμε τώρα και
	// δεν κάνουμε καμία περαιτέρω ενέργεια.

	if (!Client.session.hasOwnProperty('diastasi')) {
		Kafenio.pss.inputWidthFix();
		Kafenio.diastasiSave();
		return;
	}

	// Υπήρχε κρατημένη διάσταση στο session cookie και θα επιχειρήσουμε
	// να την εφαρμόσουμε στις διάφορες περιοχές, εφόσον μας παίρνει.
	// Παράλληλα διαγράφουμε την κρατημένη διάσταση ώστε να κρατηθεί
	// εκ νέου σε επόμενη αλλαγή.

	diastasi = Client.session.diastasi.split(':');
	delete Client.session.diastasi;

	// Επιχειρούμε αρχικά την κατά πλάτος διαμόρφωση με βάση την κρατημένη
	// διάσταση. Αν το πλάτος δεν επαρκεί, αφήνουμε τις περιοχές αναλλοίωτες.

	pssW = Kafenio.ofelimoW;
	pssW -= Kafenio.kpanelDOM.outerWidth(true);
	pssW -= Kafenio.cpanelDOM.outerWidth(true);
	if (Kafenio.flags.emoticon) pssW -= Kafenio.epanelDOM.outerWidth(true);
	pssW -= diastasi[2];
	pssW -= diastasi[3];
	if (pssW >= 0) {
		Kafenio.thamonesDOM.css('width', diastasi[2] + 'px');
		Kafenio.trapeziaDOM.css('width', diastasi[3] + 'px');
		Kafenio.pssDOM.css('width', pssW + 'px');
		Kafenio.pss.inputWidthFix();
	}

	// Τώρα επιχειρούμε την καθ' ύψος επαναφορά των περιοχών pss, ήτοι της
	// περιοχής των προσκλήσεων, της περιοχής αναζήτησης και της περιοχής
	// της συζήτησης του καφενείου.

	sizitisiH = Kafenio.ofelimoH;
	sizitisiH -= Kafenio.ptitlosDOM.outerHeight();
	sizitisiH -= Kafenio.atitlosDOM.outerHeight();
	sizitisiH -= Kafenio.stitlosDOM.outerHeight();
	sizitisiH -= Kafenio.prosklisiDOM.outerHeight() - Kafenio.prosklisiDOM.innerHeight();
	sizitisiH -= Kafenio.anazitisiDOM.outerHeight() - Kafenio.anazitisiDOM.innerHeight();
	sizitisiH -= Kafenio.sizitisiDOM.outerHeight() - Kafenio.sizitisiDOM.innerHeight();
	sizitisiH -= diastasi[4];
	sizitisiH -= diastasi[5];
	if (sizitisiH >= 0) {
		Kafenio.prosklisiDOM.css('height', diastasi[4] + 'px');
		Kafenio.anazitisiDOM.css('height', diastasi[5] + 'px');
		Kafenio.sizitisiDOM.css('height', sizitisiH + 'px');
	}
};

Kafenio.ofelimoVerticalStretch = function() {
	var oh;

	oh = Kafenio.ofelimoDOM.height();
	if (Kafenio.ofelimoH == oh) return;

	Kafenio.ofelimoDOM.children('div').css('height', oh + 'px');
	Kafenio.pss.enotitaStretch(oh);
	Kafenio.ofelimoH = oh;
};

Kafenio.ofelimoHorizontalStretch = function() {
	var ow, w;

	// Εκκινούμε τη διαδικασία οριζόντιας επαναδιάταξης με ένα συνολικό πλάτος
	// που εκετείνεται σε όλη τη διάσταση του ωφέλιμου χώρου.

	ow = Kafenio.ofelimoDOM.width();

	// Αν η επαναδιάταξη έχει ξαναγίνει τουλάχιστον μια φορά, θα επιχειρήσουμε
	// απλώς να αυξομειώσουμε το χώρο του pss.

	if (Kafenio.hasOwnProperty('ofelimoW')) {
		if (Kafenio.ofelimoW == ow) return;
		Kafenio.ofelimoW = ow;
		ow -= Kafenio.kpanelDOM.outerWidth(true);
		ow -= Kafenio.cpanelDOM.outerWidth(true);
		if (Kafenio.flags.emoticon) ow -= Kafenio.epanelDOM.outerWidth(true);
		ow -= Kafenio.thamonesDOM.outerWidth(true);
		ow -= Kafenio.trapeziaDOM.outerWidth(true);
		if (ow > 10) return Kafenio.pssDOM.css('width', ow + 'px');

		// Ο χώρος που απέμεινε για το pss ήταν ανεπαρκής, επομένως εκκινούμε
		// εκ νέου με το συνολικό πλάτος και επιχειρούμε καθολική οριζόντια
		// επαναδιάταξη.

		ow = Kafenio.ofelimoDOM.width();
	}

	Kafenio.ofelimoW = ow;

	ow -= Kafenio.kpanelDOM.outerWidth(true);
	ow -= Kafenio.cpanelDOM.outerWidth(true);
	if (Kafenio.flags.emoticon) ow -= Kafenio.epanelDOM.outerWidth(true);

	w = parseInt(ow * 0.2);
	Kafenio.thamonesDOM.css('width', w + 'px');
	w = parseInt(ow * 0.3);
	Kafenio.pssDOM.css('width', w + 'px');

	ow -= Kafenio.thamonesDOM.outerWidth(true);
	ow -= Kafenio.pssDOM.outerWidth(true);
	if (ow < 0) ow = 0;
	Kafenio.trapeziaDOM.css('width', ow + 'px');
	Kafenio.pss.inputWidthFix();
};

// Η function "diastasiSave" κρατάει τις αναλογίες των περιοχών στο session cookie
// με σκοπό τη διατήρηση της εικόνας σε περίπτωση επαναφόρτωσης της σελίδας.

Kafenio.diastasiSave = function() {
	$.ajax('kafenio/diastasiSave.php', {
		data: {
			diastasi: Kafenio.ofelimoW + ':' + Kafenio.ofelimoH + ':' +
				Kafenio.thamonesDOM.innerWidth() + ':' +
				Kafenio.trapeziaDOM.innerWidth() + ':' +
				Kafenio.prosklisiDOM.innerHeight() + ':' +
				Kafenio.anazitisiDOM.innerHeight(),
		},
	}).
	done(function(rsp) {
		if (rsp) Client.fyi.epano(rsp);
	}).
	fail(function() {
		Client.fyi.epano('Απέτυχε η καταχώρηση των ρυθμίσεων');
	});
};

Kafenio.egoTrapezi = function() {
	if (!Kafenio.ego) return false;
	return Kafenio.skiniko.skinikoTrapeziGet(Kafenio.ego.sinedriaTrapeziGet());
};

Kafenio.egoIsTrapezi = function(trapezi) {
	var egoTrapezi;

	if (!Kafenio.ego) return false;

	egoTrapezi = Kafenio.ego.sinedriaTrapeziGet();
	if (!egoTrapezi) return false;

	// Αν δεν έχει περαστεί τραπέζι, τότε επιστρέφουμε true εφόσον
	// ο παίκτης είναι συσχετισμένος με οποιοδήποτε τραπέζι.

	if (trapezi === undefined) return true;

	// Έχει περαστεί τραπέζι και επιστρέφουμε true εφόσον το τραπέζι
	// είναι το τραπέζι του παίκτη.

	switch (typeof trapezi) {
	case 'number':
	case 'string':
		return(egoTrapezi == trapezi);
	case 'object':
		return(egoTrapezi == trapezi.trapeziKodikosGet());
	}

	return false;
};

Kafenio.egoOxiTrapezi = function(trapezi) {
	return !Kafenio.egoIsTrapezi(trapezi);
};

Kafenio.egoIsPektis = function() {
	return Kafenio.ego.sinedriaIsPektis();
}

Kafenio.egoOxiPektis = function() {
	return !Kafenio.ego.sinedriaIsPektis();
}

Kafenio.egoIsTheatis = function() {
	return Kafenio.ego.sinedriaIsTheatis();
}

Kafenio.egoThesiGet = function() {
	return Kafenio.ego.sinedriaThesiGet();
}

Kafenio.egoThesiMap = function(thesi) {
	var egoThesi = Kafenio.egoThesiGet();

	switch (egoThesi) {
	case 2:
	case 3:
		thesi += (4 - egoThesi);
		if (thesi > 3) thesi -= 3;
	}

	return thesi;
};

Kafenio.isFilos = function(login) {
	var pektis = Kafenio.egoPektis;
	if (!pektis) return false;
	return(pektis.pektisSxesiGet(login) == 'ΦΙΛΟΣ');
};

Kafenio.isApoklismenos = function(login) {
	var pektis = Kafenio.egoPektis;
	if (!pektis) return false;
	return(pektis.pektisSxesiGet(login) == 'ΑΠΟΚΛΕΙΣΜΕΝΟΣ');
};

Kafenio.sizitisiKeyup = function(e, xoros) {
	var sxolio;

	if (xoros === undefined) xoros = Kafenio;
	if (e) {
		e.stopPropagation();
		switch (e.which) {
		case 13:
			xoros.sizitisi.apostoli();
			break;
		case 27:
			xoros.sizitisiInputDOM.val('');
			break;
		}
	}

	sxolio = xoros.sizitisiInputDOM.val().trim();
	if (sxolio === '') return Kafenio.sizitisiKatharismos(xoros);

	new Sizitisi({
		pektis: Client.session.pektis,
		sxolio: sxolio,
		pote: Globals.toraServer(),
	}).sizitisiCreateDOM(xoros, true);
};

Kafenio.sizitisiKatharismos = function(xoros) {
	xoros.sizitisiProepiskopisiDOM.empty().removeClass('sizitisi');
};

// Η function "alagiSxesis" καλείται ως event listener στα κλικ συσχετισμού.
// Εδώ ακολουθείται διαφορετική τακτική, καθώς το αίτημα φθάνει στον skiser
// όπου γίνονται οι διεργασίες συσχέτισης/αποσυσχέτισης και η ενημέρωση του
// client δεν γίνεται μέσω της feredata, αλλά απυεθείας με την επιστροφή.

Kafenio.alagiSxesis = function(e, login, sxesi, xoros, win) {
	xoros.inputRefocus(e);
	Client.skiserService('sxesi', 'pektis=' + login, 'sxesi=' + sxesi).
	done(function(rsp) {
		var sinedria, thesi;

		Kafenio.egoPektis.pektisSxesiSet(login, sxesi);
		Pektis.profinfoPanelRefreshDOM(login, xoros, win);

		Kafenio.skiniko.pektisEntopismosDOM(login);
		if (Kafenio.oxiTsoxa()) return;

		// Πρέπει να ενημερωθεί τυχόν εμφάνιση του συσχετισμένου στην περιοχή
		// θεατών της τσόχας.

		sinedria = Kafenio.skiniko.skinikoSinedriaGet(login);
		if (sinedria) Pektis.pektisSxesiRefreshDOM(login, sinedria.sinedriaTsoxaTheatisGetDOM());

		// Τέλος, ενημερώνουμε τυχόν εμφάνιση του συσχετισμένου ως παίκτη
		// στην τσόχα.

		thesi = Tsoxa.trapezi.trapeziThesiPekti(login);
		if (thesi) Tsoxa.pektisDataRefreshDOM(thesi);
	}).
	fail(function(err) {
		win.Client.skiserFail(err);
	});
};

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Kafenio.tsoxaActivate = function() {
	var diastasi, params;

	if (Kafenio.isTsoxa()) return Kafenio.tsoxaFocus();

	if (!Client.session.hasOwnProperty('tsoxaDiastasi'))
	Client.session.tsoxaDiastasi = '1300:640:300:500:80:80';

	diastasi = Client.session.tsoxaDiastasi.split(':');
	params = 'scrollbars=1';

	params += ',menubar=1';
	params += ',toolbar=1';
	params += ',status=1';
/*
*/
	params += ',top=' + diastasi[4];
	params += ',left=' + diastasi[5];
	params += ',width=' + diastasi[0];
	params += ',height=' + diastasi[1];
	Kafenio.tsoxa = window.open(Client.server + 'tsoxa', '_blank', params);
	Kafenio.panelRefresh();
};

Kafenio.isTsoxa = function() {
	return Kafenio.tsoxa;
};

Kafenio.oxiTsoxa = function() {
	return !Kafenio.isTsoxa();
};

Kafenio.tsoxaFocus = function() {
	if (Kafenio.oxiTsoxa()) return;

	Kafenio.tsoxa.focus();
	Tsoxa.inputRefocus();
};

Kafenio.tsoxaClose = function() {
	if (Kafenio.oxiTsoxa()) return;

	delete window.Tsoxa;
	Kafenio.tabTsoxa(false);
	Kafenio.tsoxa.close();
	delete Kafenio.tsoxa;
	Kafenio.panelRefresh();
};

// Η function "tabTsoxa" δημιουργεί tab στο αριστερό μέρος του toolbar, το οποίο
// δίνει πρόσβαση στην τσόχα του τρέχοντος τραπεζιού. Αυτό το tab by default δεν
// είναι εμφανές· εμφανίζεται μόνο όταν υπάρχει επιλεγμένο τραπέζι.
//
// Μπορούμε να χρησιμοποιήσουμε την συγκεκριμένη function για να εμφανίσουμε ή να
// αποκρύψουμε το σχετικό tab, περνώντας αντίστοιχα true/false τιμή.

Kafenio.tabTsoxa = function(emfanisi) {
	if (emfanisi === undefined) return Client.tab(Kafenio.tabTsoxaDOM = $('<a>').attr({href: '#'})
	.on('click', function(e) {
		var trapezi;

		e.stopPropagation();
		e.preventDefault();

		if (Kafenio.isTsoxa()) {
			window.open('', 'tsoxa').focus();
			Tsoxa.inputRefocus();
			return false;
		}

		trapezi = Kafenio.egoTrapezi();
		if (trapezi) {
			trapezi.trapeziGetDOM().trigger('click');
			return false;
		}

		Kafenio.tabTsoxa(false);
		return false;
	}).css('display', 'none').append(Client.sinefo('Τραπέζι')), $('#toolbarLeft'));

	Kafenio.tabTsoxaDOM.css('display', emfanisi ? 'inline' : 'none');
};

Kafenio.paraskinioAlagi = function(img) {
	$(document.body).css({backgroundImage:img});
	if (Kafenio.oxiTsoxa()) return;
	$(Kafenio.tsoxa.document.body).css({backgroundImage:img});
};
